package com.lyw.i09assistClass;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 1、一个同步辅助类，允许多个线程在达到一个共同屏障点之前相互等待，直到都达到了才结束
 *
 * 2、CyclicBarrier可以被重复使用。它被称为"循环"屏障，是因为一旦所有线程都到达屏障点，它就会重新计数，
 * 再次等待所有线程。
 *
 * 3、如果线程数不满足当前制定的数量，就会一直等待
 *
 * @author lyw
 * @Date 2023/7/10-下午4:36
 */
public class CyclicBarrierDemo {

  public static void main(String[] args) {
    // 第一个参数： 参与的线程个数
    // 第二个参数： 所有的线程都成功到达屏障点之后执行的线程
    CyclicBarrier cyclicBarrier = new CyclicBarrier(3, () -> {
      System.out.println("最终合并结果.....");
    });

    for (int i = 1; i <= 3; i++) {
      new Thread(() -> {
        System.out.println(Thread.currentThread().getName() + " 开始执行");
        System.out.println(Thread.currentThread().getName() + " 到达屏障点");
        try {
          cyclicBarrier.await();
        } catch (InterruptedException e) {
          e.printStackTrace();
        } catch (BrokenBarrierException e) {
          e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " 执行结束");
      }, String.valueOf(i)).start();
    }
  }
}
